package com.example.base_model.ext

import com.example.base_model.network.result.RequestStatus

/**
 * @Author jiangKunKun
 * @CreateDate 2025/7/24
 * @Description 网络请求状态扩展，提供了一种 DSL 风格的方式来处理不同的请求状态。
 * @SpittingGrooves
 */

/**
 * 一个 DSL 风格的扩展函数，用于根据 [RequestStatus] 的不同状态执行相应的操作。
 *
 * 这提供了一种比标准 `when` 表达式更具声明性的方式来处理网络请求的生命周期。
 *
 * @receiver RequestStatus 要处理的状态。
 * @param idle 当状态为 [RequestStatus.IDLE] (空闲) 时执行的代码块。
 * @param start 当状态为 [RequestStatus.START] (请求开始) 时执行的代码块。
 * @param dataSuccess 当状态为 [RequestStatus.DATA_SUCCESS] (数据成功) 时执行的代码块。
 * @param dataFail 当状态为 [RequestStatus.DATA_FAIL] (数据失败) 时执行的代码块。
 * @param error 当状态为 [RequestStatus.ERROR] (请求错误) 时执行的代码块。
 * @param finish 当状态为 [RequestStatus.FINISH] (请求完成，无论成功或失败都会调用) 时执行的代码块。
 *
 * **用法示例:**
 * ```
 * myRequestStatus.whenStatus(
 *     start = { showLoading() },
 *     dataSuccess = { updateUi(data) },
 *     error = { showError(message) },
 *     finish = { hideLoading() }
 * )
 * ```
 */
fun RequestStatus.whenStatus(
    idle: (() -> Unit)? = null,
    start: (() -> Unit)? = null,
    dataSuccess: (() -> Unit)? = null,
    dataFail: (() -> Unit)? = null,
    error: (() -> Unit)? = null,
    finish: (() -> Unit)? = null
) {
    when (this) {
        RequestStatus.IDLE -> idle?.invoke()
        RequestStatus.START -> start?.invoke()
        RequestStatus.DATA_SUCCESS -> dataSuccess?.invoke()
        RequestStatus.DATA_FAIL -> dataFail?.invoke()
        RequestStatus.ERROR -> error?.invoke()
        RequestStatus.FINISH -> finish?.invoke()
    }
}
